package 力扣.双指针.双指针;

import java.util.Arrays;

public class 合并两个有序数组88 {
    public static void main(String[] args) {
        int[] ints1 = {1, 2, 3, 0, 0,0};
        int[] ints2 = {2,5,6};
//        int[] ints1 = {1};
//        int[] ints2 = {};
//        int[] ints1 = {2,0};
//        int[] ints2 = {1};
        merge(ints1, 3, ints2, 3);
        System.out.println(Arrays.toString(ints1));
    }
    /**
      开辟一个新的数组
      开辟两个新的指针p1、p2分别指向num1、num2 并比较 num1[p1] num2[p2] 取两者最小的作为新数组的元素；
        直到p1或者p2到达其数组的末尾，然后拷贝剩余所有的元素进入新数组。最后将新数组拷贝到nums1数组中
     */
    public static void merge(int[] nums1, int m, int[] nums2, int n) {
        int[] ints = new int[ m + n ];
        int p = 0,q = 0;// 开辟两个新指针
        int i = 0;//新数组的指针
        while (p < m && q < n){
            ints[i++] = nums1[p] < nums2[q] ? nums1[p++] : nums2[q++];
        }
        // 某一个指针到达末尾，拷贝剩余的全部
        if (p != m){
            System.arraycopy(nums1, p, ints, i, m - p);//拷贝剩余的全部
            System.arraycopy(ints, 0, nums1, 0, m+n);//最后将新数组拷贝到nums1数组中
        }
        if (q != n){
            System.arraycopy(nums2, q, ints, i , n - q);//拷贝剩余的全部
            System.arraycopy(ints, 0, nums1, 0, m+n);//最后将新数组拷贝到nums1数组中
        }

    }
}
